Android OpenGL的简单使用(5):多点、线、面的绘制

Posted by alonealice on 2020-12-26

在绘制点的基础上,我们可以拓展来绘制多个点、线和面。在OpenGL ES中,面特指一个三角形。绘制调用glDrawArrays(int mode, int first, int count)方法。

mode的参数:

1
2
3
4
5
6
7
- GL_POINTS ————绘制独立的点
- GL_LINE_STRIP————绘制连续的线段,不封闭
- GL_LINE_LOOP————绘制连续的线段,封闭
- GL_LINES————顶点两两连接,为多条线段构成
- GL_TRIANGLES————每隔三个顶点构成一个三角形
- GL_TRIANGLE_STRIP————每相邻三个顶点组成一个三角形
- GL_TRIANGLE_FAN————以一个点为三角形公共顶点,组成一系列相邻的三角形

顶点数据

1
2
3
4
5
6
7
//顶点数组
private float[] mArray = {
-0.5f, -0.5f, 0f,
-0.5f, 0.5f, 0f,
0.5f, 0.5f, 0f,
0.5f, -0.5f, 0f
};

3个值代表一个顶点,因此这里有3个顶点。

绘制多点

1
2
// 绘制点
gl.glDrawArrays(GL10.GL_POINTS, 0, 4);

在glDrawArrays设置需要绘制的点的数量。如果数量超过设置的坐标的数量,那么会在原点绘制

绘制不封闭线

1
2
3
4
5
//设置线的宽度
gl.glLineWidth(30f);

// 绘制线
gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, 5);

glDrawArrays中的参数为GL10.GL_LINE_STRIP。同样,如果数量超过设置的坐标的数量,那么会在原点绘制连线。

绘制封闭连线

1
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 5);

glDrawArrays中的参数为GL10.GL_LINE_LOOP。

绘制多条连线

1
gl.glDrawArrays(GL10.GL_LINES, 0, 5);

glDrawArrays中的参数为GL10.GL_LINES。两个连之前绘制一条线,即第一个和第二个点绘制一条线,第三个和第四个点绘制一条线。多出的点会被舍弃。

绘制面

1
2
3
4
5
6
7
8
//顶点数组
private float[] mArray = {
-0.5f, -0.5f, 0f,
-0.5f, 0.5f, 0f,
0.5f, 0.5f, 0f,
0.5f, -0.5f, 0f,
0f, -0.8f, 0f
};
1
2
// 绘制面
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);

绘制模式为GL_TRIANGLES,即1,2,3个点绘制一个图形,4,5,6个点绘制一个。当顶点个数不足以绘制三角形时,就会被忽略,如果设置的点数量超过顶点数,会用原点顶替(如上面的情况)。

绘制连续的面

1
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5);

指定绘制模式为GL_TRIANGLE_STRIP。这个模式是什么呢,就是会用相邻的3个点绘制一个面,比如刚刚顶点数组,就用1,2,3个点绘制一个面,在用2,3,4绘制一个,再用3,4,5绘制一个。

绘制初始点的面

1
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);

指定绘制模式为GL_TRIANGLE_FAN,本身以第一个顶点为公共点,绘制了相邻的三角形。比如上面的点,就会以1,2,3绘制一个面,1,3,4绘制一个,再以1,4,5绘制一个。

索引绘制

索引就是让不同的顶点按照规定的顺序来绘制,这样就不会导致各种三角形的错乱。

首先定义一个索引数组,这里的0,1,2等指的是顶点顺序,比如0,1,2就是按照0,1,2的顺序绘制三角形,0,2,3就是按照0,2,3的顺序绘制三角形,就不会出现0,1,2 和1,2,3 以及 0,2,3都绘制的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//索引数组
private short[] indices={
0,1,2,
0,2,3,

4,5,6,
4,6,7,

8,9,10,
8,10,11,

12,13,14,
12,14,15,

16,17,18,
16,18,19,

20,21,22,
20,22,23,
};

获取浮点型索引数据:

1
2
//获取浮点型索引数据
indexbuffer= Utils.getShortBuffer(indices);

绘制图形时:

1
2
3
4
//绘制三角形  
//gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP , 0, 24);

gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexbuffer);

OpenGL ES提供了两类方法来绘制一个空间几何图形:

1
2
3
4
-public abstract void glDrawArrays(int mode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。


- public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

glDrawElements各个参数如下:

1
2
3
4
5
6
7
- mode——指明被渲染的是哪种图元,被允许的符号常量有GL_POINTS,GL_LINE_STRIP,GL_LINE_LOOP,GL_LINES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN 和GL_TRIANGLES

- count——指明被渲染的元素个数。

- type——指明索引指的类型,不是GL_UNSIGNED_BYTE 就是GL_UNSIGNED_SHORT。

- indices——指明存储索引的位置指针。